package com.nuc.bigdata.api.controller;

import com.nuc.bigdata.annotation.ResponseResult;
import com.nuc.bigdata.app.service.NewsService;
import com.nuc.bigdata.domain.vo.CommentsVO;
import com.nuc.bigdata.domain.vo.NewsVO;
import com.nuc.bigdata.feign.dto.NewsCommentsDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;

/**
 * 新闻controller，与前端交互
 * @author JackLuo
 * @date 2019/11/18
 */
@RestController
@RequestMapping("/front")
@CrossOrigin
public class NewsController {
    private final NewsService newsService;

    @Autowired
    NewsController(NewsService newsService){
        this.newsService = newsService;
    }

    /**
     * 获取所有新闻
     * @return 这里经过ResponseResult注解包装，返回的是Result类型，为了能兼容Service返回类型，就使用了Object类型
     */
    @GetMapping("/news")
    @ResponseResult
    public Object listNews(){
        ArrayList<NewsVO> newsVOS = newsService.listNews();
        return newsVOS;
    }

    /**
     * 根据指定新闻唯一标识获取新闻VO
     * @param newsId 新闻唯一标识
     * @return 这里经过ResponseResult注解包装，返回的是Result类型，为了能兼容Service返回类型，就使用了Object类型
     */
    @GetMapping("/news/{newsId}")
    @ResponseResult
    public Object getNews(@PathVariable("newsId")String newsId){
        NewsVO news = newsService.getNews(newsId);
        return news;
    }

    /**
     * 根据指定新闻唯一标识获取评论
     * @param newsId 新闻唯一标识
     * @param pageSize 页码
     * @return 这里经过ResponseResult注解包装，返回的是Result类型，为了能兼容Service返回类型，就使用了Object类型
     */
    @GetMapping("/news/{newsId}/comments")
    @ResponseResult
    public Object getNewsComments(@PathVariable("newsId")String newsId,
                                  @RequestParam Long pageSize){
        ArrayList<CommentsVO> commentsVOS = newsService.listNewsComments(newsId, pageSize);
        return commentsVOS;
    }


    /**
     * 发送评论
     * @param newsId 新闻唯一标识
     * @param commentsDto 不使用RequestBody，是因为vue-resource发送post请求传输json会跨域
     * @return 这里经过ResponseResult注解包装，返回的是Result类型，为了能兼容Service返回类型，就使用了Object类型
     */
    @PostMapping("/news/{newsId}/comment")
    @ResponseResult
    public Object createNewsComments(@PathVariable("newsId")String newsId,NewsCommentsDto commentsDto){
        newsService.createNewsComment(newsId, commentsDto);
        return null;
    }

    /**
     * 用户点赞评论
     * @param commentId 评论唯一标识
     * @param userId 用户唯一标识
     * @return 这里经过ResponseResult注解包装，返回的是Result类型，为了能兼容Service返回类型，就使用了Object类型
     */
    @PostMapping("/news/{newsId}/comments/{commentId}/like")
    @ResponseResult
    public Object toCommentLike(@PathVariable("commentId")String commentId,String userId){
        newsService.toCommentLike(commentId, userId);
        return null;
    }
}
